#ifndef JUGADOR_H
#define JUGADOR_H

#include "../sockets/udp.h"
#include "../parsing/parsing.h"
#include "../parsing/marca.h"
#include <stdio.h>
#include<pthread.h>


using namespace std;


class Jugador
{
protected:
    Udp jug;
    int posicion_x, posicion_y;
    float BALL[4];
    Parsing parser;

    pthread_mutex_t* nl;
    int numero;
    char lado;
    string equipo;

    pthread_mutex_t* vis;
    pthread_cond_t* vista_nueva;
    string vista;

    pthread_mutex_t* est;
    int estado;

    pthread_mutex_t* vel;
    float velocidad;

    pthread_mutex_t* cic;
    pthread_cond_t* envio;
    int ciclo;

    int ciclo_vista;// SIN MUTEX por que solo se usa en una función. Si quieres usarlo en otro sitio,
                    // añade mutex en Jugador::guardar y en la funcion que uses.

    int ciclo_giro;
    int ancho_vista;
    int limite_b;
    int limite_t;
    int limite_l;
    int limite_r;


    pthread_mutex_t* ang;   //El ANGULO se cuenta en sentido HORARIO. Con 0 grados en la posicion inicial
    int angulo;// Este ángulo nunca será exacto, solo es una aproximación

public:
    Jugador(pthread_mutex_t* NL,
            pthread_mutex_t* VIS,
            pthread_cond_t* VIS_NUE,
            pthread_mutex_t* EST,
            pthread_mutex_t* VEL,
            pthread_mutex_t* CIC,
            pthread_cond_t* ENVIO,
            pthread_mutex_t* ANG,
            string EQUIPO="Grupo1");
    int girar(int);
    void correr(int);
    void conectar(int, char*,bool portero=0);
    void desconectar();
    void mover();
    void mover(int x, int y);
    void chutar(int fuerza, float direccion);
    void atrapar(float direccion);
    void getbalon();
    void setposicion(int x, int y);
    int getposicion_x(){return posicion_x;}
    int getposicion_y(){return posicion_y;}
    void mostrar();
    void guardar();
    int getEstado();
    void pruebathreads();
    void correrDentro(int f);
    bool buscarBalon(bool sentido=0);
    float perseguirBalon();
    Marca vigilar();
    int recepcion(bool);
    int interceptar(bool lado);
    void girarCabeza(int);
    int orientar(bool);
    //void correrConBalon();
    void anchoVista(int);
    float velocidadRelativa(string);
    void posicionInicial(bool portero=0);
    void parar();
    void tiroPuerta();
    string cambioCampo(string);
    char getLado();
    void jugar();
    void localizarCompanero(float f,Marca ball);
    void saque();
    void juegoNormal();
    void jugarPortero();
    void zonas();
    bool correrZona(int f=100);
    void juegoNormalAlex();
    float perseguirBalonAlex();
};

#endif // JUGADOR_H
